package Demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Person {
    /**
    * @Autowired 自动装配注解
    * 该注解作用是希望让Spring容器来对这个属性进行初始化，将其管理的一个对象设置到该属性上
    * 需要注意，该属性必须是Spring容器管理的一个对象。
    * 那么Spring容器在初始化Person时，才会将Shirt对象设置到这个属性上。建立Person与
    * Shirt的依赖关系。
     *
     *
     * 如果Spring容器在自动装配时抛出异常:NoUniqueBeanDefinitionException
     * 说明容器找到了多个子类，他们都实现了衣服接口，无法确定应当将哪个对象设置到这里
     *
     * 解决装配冲突:
     * 1:确保Clothes接口的实现类只有一个被Spring容器管理
     * 2:可以为多个Clothes的实现类在添加@Component注解时，通过注解参数为其定义组件名
     * 此时这里需要让Spring进行自动装配置，再添加注解0ualifier,来通过组件名进行装配
     * 例如:当前代码@Qualifier("summer")
     * Spring容器创建时扫描demo3包，发现了两个实现了Clothes接口的类:
     *           @Component("summer")      <----可以匹配这里@Qualifier("summer")
     *           public class Shirt{...}
     *
     *           @Component("winter")
     *           public class Sweater{...}
     *
     *           此时容器会将Shirt实例装配到这里
     * */

    @Autowired//自动装配
    @Qualifier("summer")
    private Clothes clothes;
    //private Shirt shirt;//Person需要使用shirt时，将其定义为一个属性
   // private Sweater sweater;
    public void play(){
        /**当A类的某个方法逻辑中，调用了B类的功能，那么A类就与B类产生了"依赖关系
         * Person的play方法依赖Shirt的wear方法完成部分功能，因此Person类与
         * Shirt类存在依赖关系。
         * */
        //穿上衣服
        //Shirt shirt = new Shirt();不要直接new，产生强耦合，后续可能导致代码修改
        //sweater.wear();
        clothes.wear();

        //shirt.wear();
        //出去玩
        System.out.println("出去玩!");
    }
}
